//package com.example.advice.ControllerAdvice;
//
//import com.example.common.core.AjaxResult;
//import com.example.common.entity.Result;
//import lombok.SneakyThrows;
//import org.springframework.core.MethodParameter;
//import org.springframework.http.MediaType;
//import org.springframework.http.server.ServerHttpRequest;
//import org.springframework.http.server.ServerHttpResponse;
//import org.springframework.web.bind.annotation.ExceptionHandler;
//import org.springframework.web.bind.annotation.RestControllerAdvice;
//import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
//
//import javax.annotation.PostConstruct;
//import javax.servlet.http.HttpServletRequest;
//import java.lang.reflect.Field;
//import java.lang.reflect.Method;
//import java.time.LocalDateTime;
//import java.util.*;
//
///**
// * advice，可以修改从controller返回的数据
// * @author Destinycc
// */
//@RestControllerAdvice
//public class ApiResponseBodyAdvice implements ResponseBodyAdvice {
//    private static List<String> fsList = new ArrayList<>();
//
//    /**
//     * 初始化fsList，linkedHashMap的内部变量列表
//     */
//    @PostConstruct
//    public void init(){
//        Field[] linkedHashMapFields = LinkedHashMap.class.getDeclaredFields();
//        for (Field f: linkedHashMapFields){
//            fsList.add(f.getName());
//        }
//    }
//
//
//    /**
//     * 启用；return true
//     * 禁用：return false
//     * @param methodParameter
//     * @param aClass
//     * @return
//     */
//    @Override
//    public boolean supports(MethodParameter methodParameter, Class aClass) {
//        return false;
//    }
//
//    /**
//     * 统一处理controller的返回值，将时间变量作偏移一秒的处理
//     * @param o
//     * @param methodParameter
//     * @param mediaType
//     * @param aClass
//     * @param serverHttpRequest
//     * @param serverHttpResponse
//     * @return
//     */
//    @SneakyThrows
//    @Override
//    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//        if (Objects.isNull(o)){
//            return AjaxResult.success();
//        }
//        if (!(o instanceof AjaxResult)){
//            return AjaxResult.success(o);
//        }
//        AjaxResult result = (AjaxResult) o;
//        o = result.get("data");
//        if (o instanceof Map){
//            return result;
//        }
//        //获取返回值o所有的方法
//        Method[] methods = o.getClass().getMethods();
//        Class oClazz = o.getClass();
//        Map<String, Class> methodNameParamClassMap = new HashMap<>();
//        for (Method method: methods){
//            Class[] paramsClazzs = method.getParameterTypes();
//            if (paramsClazzs != null && paramsClazzs.length != 0) {
//                methodNameParamClassMap.put(method.getName(), paramsClazzs[0]);
//            }
//        }
//        //获取返回值o中所有的field
//        Field[] fields = o.getClass().getDeclaredFields();
//        for (Field field: fields){
//            String fieldName = field.getName();
//            if (fsList.contains(fieldName)){
//                continue;
//            }
//
//            //fieldName首字母大写
//            String key = Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
//
//            //获取变量值
//            String methodName = "get" + key;
//            Method method;
//            method = oClazz.getMethod(methodName);
//            Object getObject = method.invoke(o);
//
//            if (Objects.isNull(getObject)){
//                System.out.println("this param is null");
//            }else {
//                System.out.println(getObject.toString());
//            }
//            if (getObject instanceof LocalDateTime){
//                //如果是LocalDateTime，作偏移
//                methodName = "set" + key;
//                Class paramClass = methodNameParamClassMap.get(methodName);
//                method = oClazz.getMethod(methodName, paramClass);
//                LocalDateTime time = (LocalDateTime) getObject;
//                time = time.plusSeconds(1);
//                method.invoke(o, time);
//            }
//        }
//        return AjaxResult.success((String) result.get("msg"), o);
//    }
//}
